home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / main.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  8KB  |  403 lines

  1. /**
  2.  ***************************************************************************
  3.  *
  4.  * Datei:
  5.  *      RSysMain.c
  6.  *
  7.  * Inhalt:
  8.  *
  9.  *      --- Globale Routinen ---
  10.  *
  11.  *    void _icon_parse ( char *progname );
  12.  *    void _main ( long alen , char *aptr );
  13.  *    void _wb_parse ( void );
  14.  *
  15.  *      --- Lokale  Routinen ---
  16.  *
  17.  *
  18.  * Bemerkungen:
  19.  *      Startup-Routinen von RSys; ruft das Hauptprogramm auf.
  20.  *
  21.  * Erstellungsdatum:
  22.  *      07-Jul-93     Rolf Böhme
  23.  *
  24.  * Änderungen:
  25.  *      07-Jul-93     Rolf Böhme        Erstellung
  26.  *
  27.  ***************************************************************************
  28.  **/
  29.  
  30. #include "RSys.h"
  31. #include "protos.h"
  32.  
  33. //extern int Enable_Abort;
  34.  
  35.  
  36. #define QUOTE       '"'
  37. #define ESCAPE '*'
  38. #define NL '\n'
  39.  
  40.  
  41. extern char __stdiowin[];
  42. extern char __stdiov37[];
  43.  
  44. static int argc;        /* arg count */
  45. static char **targv, **argv;    /* arg pointers */
  46.  
  47.  
  48. extern char _dir[], _file[];
  49.  
  50. static DISKOBJECT *dop;
  51.  
  52. /* 
  53.  *********************
  54.  */
  55.  
  56. static char *
  57. ToolType (char *type)
  58. {
  59.   return (char *) FindToolType ((UBYTE **) dop->do_ToolTypes,
  60.                 (UBYTE *) (type));
  61. }
  62.  
  63. /* 
  64.  *********************
  65.  */
  66.  
  67. void
  68. _icon_parse (char *progname)
  69. {
  70.   char *cp;
  71.  
  72.   if (IconBase = OpenLibrary ((UBYTE *) "icon.library", 0L))
  73.     {
  74.       if (dop = GetDiskObject ((UBYTE *) progname))
  75.     {
  76.       if (cp = ToolType ("CX_HOTKEY"))
  77.         strcpy (&hotkey[0][0], cp);
  78.  
  79.       if (cp = ToolType ("CX_CRYPT"))
  80.         strcpy (&hotkey[1][0], cp);
  81.  
  82.       if (cp = ToolType ("CX_FINDFILE"))
  83.         strcpy (&hotkey[2][0], cp);
  84.  
  85.       if (cp = ToolType ("CX_FORMAT"))
  86.         strcpy (&hotkey[3][0], cp);
  87.  
  88.       if (cp = ToolType ("CX_HUNKLIST"))
  89.         strcpy (&hotkey[4][0], cp);
  90.  
  91.       if (cp = ToolType ("CX_CRC"))
  92.         strcpy (&hotkey[5][0], cp);
  93.  
  94.       if (cp = ToolType ("CX_SAVEWINDOW"))
  95.         strcpy (&hotkey[6][0], cp);
  96.  
  97.       if (cp = ToolType ("CX_FILEREQUEST"))
  98.         strcpy (&hotkey[7][0], cp);
  99.  
  100.       if (cp = ToolType ("NOFASTMODE"))
  101.         Flags.fastmode = 0;
  102.  
  103.       if (cp = ToolType ("NOSORT"))
  104.         Flags.sortmode = 0;
  105.  
  106.       if (cp = ToolType ("WORKINGBAR"))
  107.         Flags.workingbar = 1;
  108.  
  109.       if (cp = ToolType ("AUTOFRONT"))
  110.         Flags.autofront = 1;
  111.  
  112.       if (cp = ToolType ("MOUSEWINDOW"))
  113.         Flags.mousewindow = 1;
  114.  
  115.       if (cp = ToolType ("TOPAZFONT"))
  116.         Flags.sysfont = 1;
  117.  
  118.       if (cp = ToolType ("NOSAVEASKING"))
  119.         Flags.saveasking = 0;
  120.  
  121.       if (cp = ToolType ("TEXTFORMATTER"))
  122.         Flags.textformat = 1;
  123.  
  124.       if (cp = ToolType ("NOAPPICON"))
  125.         Flags.appicon = 0;
  126.  
  127.       if (cp = ToolType ("BACKPATTERNCOL"))
  128.         bpc = atoi (cp);
  129.  
  130.       if (cp = ToolType ("BACKGROUNDCOL"))
  131.         bgc = atoi (cp);
  132.  
  133.       if (cp = ToolType ("BACKPATTERN"))
  134.         bpp = ahtoi (cp);
  135.  
  136.       if (cp = ToolType ("DETAILPEN"))
  137.         winddetail = atoi (cp);
  138.  
  139.       if (cp = ToolType ("BLOCKPEN"))
  140.         windblock = atoi (cp);
  141.  
  142.       if (cp = ToolType ("MENUPEN"))
  143.         menudetail = atoi (cp);
  144.  
  145.       if (cp = ToolType ("HARDWAREDATA"))
  146.         strcpy ((char *) RSysFiles.Hardware, cp);
  147.  
  148.       if (cp = ToolType ("LIBOFFDATA"))
  149.         strcpy ((char *) RSysFiles.LibOffsets, cp);
  150.  
  151.       if (cp = ToolType ("AGUIDEDOC"))
  152.         strcpy ((char *) RSysFiles.Guide, cp);
  153.  
  154.       if (cp = ToolType ("AGUIDECONTEXT"))
  155.         strcpy ((char *) RSysFiles.GuideContext, cp);
  156.  
  157.       if (cp = ToolType ("ACTIONFILE"))
  158.         strcpy ((char *) RSysFiles.ActionFile, cp);
  159.  
  160.       if (cp = ToolType ("ICONX"))
  161.         iconx = atoi (cp);
  162.  
  163.       if (cp = ToolType ("ICONY"))
  164.         icony = atoi (cp);
  165.  
  166.       if (cp = ToolType ("OUTWINDOW"))
  167.         strcpy ((char *) autocon, cp);
  168.       else
  169.         strcpy ((char *) autocon, "CON:/40//150/Sys - Window/auto/close");
  170.  
  171.       if (cp = ToolType ("LISTHEIGHT"))
  172.         {
  173.           listviewheight = atoi (cp);
  174.  
  175.           if (listviewheight == -1)
  176.         listviewheight = 1000;
  177.           else if (listviewheight < 2)
  178.         listviewheight = 10;
  179.  
  180.           SysHeight += (listviewheight - 10) * 8;
  181.         }
  182.  
  183.       FreeDiskObject (dop);
  184.     }
  185.  
  186.       CloseLibrary (IconBase);
  187.  
  188.       IconBase = NULL;
  189.     }
  190.  
  191. }
  192. /*
  193.  * __ main from SAS example (thanks SASSY folks :)
  194.  */
  195. void __stdargs
  196. __main (char *line)
  197.  
  198. {
  199.   char *argbuf;
  200.   int i;
  201.  
  202. /***
  203. *     First count the number of arguments
  204. ***/
  205.  
  206.   argbuf = line;
  207.   for (argc = 0;; argc++)
  208.     {
  209.       while (isspace (*line))
  210.     line++;
  211.       if (*line == '\0')
  212.     break;
  213.       if (*line == QUOTE)
  214.     {
  215.       line++;
  216.       while (*line != QUOTE && *line != 0)
  217.         {
  218.           if (*line == ESCAPE)
  219.         {
  220.           line++;
  221.           if (*line == 0)
  222.             break;
  223.         }
  224.           line++;
  225.         }
  226.       if (*line)
  227.         line++;
  228.     }
  229.       else
  230.     /* non-quoted arg */
  231.     {
  232.       while ((*line != '\0') && (!isspace (*line)))
  233.         line++;
  234.       if (*line == '\0')
  235.         break;
  236.     }
  237.     }
  238.  
  239.   if (argc)
  240.     {
  241.       argv = AllocMem ((argc + 1) * sizeof (char *), MEMF_CLEAR);
  242.       if (argv == NULL)
  243.     exit (20);
  244.  
  245.       /***
  246.       *     Build argument pointer list
  247.       ***/
  248.       i = 0;
  249.       line = argbuf;
  250.       while (1)
  251.     {
  252.       while (isspace (*line))
  253.         line++;
  254.       if (*line == '\0')
  255.         break;
  256.       if (*line == QUOTE)
  257.         {
  258.           argbuf = argv[i++] = ++line;    /* ptr inside quoted string */
  259.           while (*line != QUOTE && *line != 0)
  260.         {
  261.           if (*line == ESCAPE)
  262.             {
  263.               line++;
  264.               switch (*line)
  265.             {
  266.             case '\0':
  267.               *argbuf = 0;
  268.               goto linedone;
  269.             case 'E':
  270.               *argbuf++ = ESC;
  271.               break;
  272.             case 'N':
  273.               *argbuf++ = NL;
  274.               break;
  275.             default:
  276.               *argbuf++ = *line;
  277.             }
  278.               line++;
  279.             }
  280.           else
  281.             {
  282.               *argbuf++ = *line++;
  283.             }
  284.         }
  285.           if (*line)
  286.         line++;
  287.           *argbuf++ = '\0';    /* terminate arg */
  288.         }
  289.       else
  290.         /* non-quoted arg */
  291.         {
  292.           argv[i++] = line;
  293.           while ((*line != '\0') && (!isspace (*line)))
  294.         line++;
  295.           if (*line == '\0')
  296.         break;
  297.           else
  298.         *line++ = '\0';    /* terminate arg */
  299.         }
  300.     }            /* while */
  301.     }
  302. linedone:
  303.  
  304.   targv = (argc == 0) ? (char **) _WBenchMsg : (char **) &argv[0];
  305.  
  306.  
  307. /***
  308. *     Call user's main program
  309. ***/
  310.  
  311.   was_main (argc, targv);    /* call main function */
  312.  
  313.   exit (0);
  314. }
  315.  
  316. /* 
  317.  *********************
  318.  */
  319. void
  320. MEMCLEANUP_DESTRUCTOR (argcleanup)
  321. {
  322.   if (argc && argv)
  323.     FreeMem (argv, (argc + 1) * sizeof (char *));
  324. }
  325.  
  326.  
  327. /* 
  328.  *********************
  329.  */
  330.  
  331.  
  332. void
  333. was_main (long alen, char **aptr)
  334. {
  335.   PROCESS *pp;
  336.  
  337.   SysBase = *(EXECBASE **) 4;
  338.  
  339.   if (SysBase->LibNode.lib_Version < 36)
  340.     {
  341.       if (alen)
  342.     Write (Output (), (UBYTE *) "WB 2.0 ONLY!\n", 13);
  343.       exit (0);
  344.     }
  345.  
  346.   if (DOSBase = (DOSLIBRARY *) OpenLibrary ((STRPTR) "dos.library", 36L))
  347.     {
  348.       LastID = SYSTEMINFO;
  349.  
  350.       pp = (PROCESS *) FindTask (0L);
  351.  
  352.       strcpy (hotkey[0], "lshift rshift y");
  353.       strcpy (hotkey[1], "lshift rshift k");
  354.       strcpy (hotkey[2], "lshift rshift s");
  355.       strcpy (hotkey[3], "lshift rshift f");
  356.       strcpy (hotkey[4], "lshift rshift h");
  357.       strcpy (hotkey[5], "lshift rshift c");
  358.       strcpy (hotkey[6], "lshift rshift w");
  359.       strcpy (hotkey[7], "lshift rshift esc");
  360.  
  361.       if (pp->pr_CLI)
  362.     {
  363.  
  364.       RSysName = AllocVec (MAXFULLNAME, MEMF_CLEAR);
  365.       if (RSysName)
  366.         {
  367.           NameFromLock (GetProgramDir (), (UBYTE *) RSysName, MAXFULLNAME);
  368.           strcpy (_dir, RSysName);
  369.           strcpy (_file, (char *) FilePart ((UBYTE *) argv[0]));
  370.  
  371.           AddPart ((UBYTE *) RSysName, FilePart ((UBYTE *) argv[0]), MAXFULLNAME);
  372.         }
  373.  
  374.       //Enable_Abort = 1;
  375.     }
  376.       else
  377.     {
  378.       WaitPort (&pp->pr_MsgPort);
  379.  
  380.       WBenchMsg = (WBSTARTUP *) GetMsg (&pp->pr_MsgPort);
  381.  
  382.       if (WBenchMsg->sm_ArgList)
  383.         {
  384.           NameFromLock (WBenchMsg->sm_ArgList->wa_Lock, (UBYTE *) _dir, MAXFULLNAME);
  385.           strcpy (_file, (char *) FilePart ((UBYTE *) WBenchMsg->sm_ArgList->wa_Name));
  386.  
  387.           RSysName = AllocVec (strlen (WBenchMsg->sm_ArgList->wa_Name) + 1, MEMF_CLEAR);
  388.           if (RSysName)
  389.         strcpy (RSysName, WBenchMsg->sm_ArgList->wa_Name);
  390.  
  391.           CurrentDir (WBenchMsg->sm_ArgList->wa_Lock);
  392.         }
  393.  
  394.       argv = (char **) WBenchMsg;
  395.     }
  396.  
  397.       if (RSysName)
  398.     _icon_parse (RSysName);
  399.  
  400.       main (argc, argv);
  401.     }
  402. }
  403.